"""
【闭包】
"""
"""
【闭包】
    
    在函数嵌套的前提下，内部函数使用了外部函数的变量，并且外部函数返回了内部函数，我们把这个使用了外部函数变量的内部函数称为“闭包”
    
    当内部函数想修改外部函数的值，需要使用 nonlocal 关键字来修饰外部函数的变量
    
    【优点】
        无需定义全局变量即可实现通过函数持续的访问、修改某个值。
        闭包使用的变量是位于外部函数内的，难以被错误的调用修改。
    【缺点】
        由于内部函数持续的引用外部函数的值，所以会导致这部分的内存空间不被释放，一直占用内存。
"""


# 简答的闭包
def outer(logo):
    def inner(msg):
        print(f"<{logo}>{msg}<{logo}>")

    return inner


fn1 = outer("zhu")
fn1(111)


def outer(num1):
    def inner(num2):
        nonlocal num1  # 使用 nonlocal 修饰，即可在内部函数修改这个外部函数的变量
        num1 = num1 + num2
        print(num1)

    return inner


fn2 = outer(10)
fn2(1)
fn2(1)
